package com.qf.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.qf.clients.CourseClient;
import com.qf.pojo.repVo.BaseResp;
import com.qf.pojo.repVo.QfCourseRepVo;
import com.qf.service.ShopCardService;
import com.qf.utils.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

@Service
public class ShopCardServiceImpl implements ShopCardService {

    @Autowired
    RedisTemplate redisTemplate;
    @Autowired
    JwtUtils jwtUtils;
    @Autowired
    CourseClient courseClient;


    private static final  String SHOP_CARD_="shop_card_";
    @Override
    public BaseResp addShopCard(Map map, HttpServletRequest request) {
        //1.使用redis作为购物车，第一层key 使用用户的id为key值，第二层key使用课程的id，value课程的详情信息
        //1.解析用户的id
        String token = request.getHeader("token");
        String userid = jwtUtils.verfiy(token).toString();
        Object courseid = map.get("courseid");
        if (courseid==null){
            return new BaseResp(0,"商品信息有误！",null,null);
        }
        String courseId= String.valueOf(courseid);
        //判断Redis中是否有该用户的购物车
        Boolean aBoolean = redisTemplate.hasKey(SHOP_CARD_ + userid);
        if (aBoolean){
            //判断购物车中的该课程是否已经存在
            Object o = redisTemplate.opsForHash().get(SHOP_CARD_ + userid, courseId);
            if (o!=null){
                //如果课程已存在，不允许重复向购物车中添加，是根据商品的属性来进行判断的，如果是普通的商品，应该数量+1，但是课程属于
                //特殊的商品类型，购买一次，即可，不允许重复购买
                return new BaseResp(0,"课程已经添加！请勿重复添加！",null,null);
            }
        }
            //说明购物车中不存在该课程，需要向购物车添加该课程
            //需要远程调用课程服务通过id获取到课程的详情信息
            BaseResp courseDetailById = courseClient.findCourseDetailById(Integer.valueOf(courseId));
            if (courseDetailById.getCode()!=0){
                Object data = courseDetailById.getData();
                //使用json转为课程详情对象
                String s = JSONObject.toJSONString(data);
                QfCourseRepVo courseDetail = JSONObject.parseObject(s, QfCourseRepVo.class);
                //将课程添加到Redis中
                redisTemplate.opsForHash().put(SHOP_CARD_ + userid, courseId,courseDetail);

            }else{
                return new BaseResp(0,"课程已下架，请联系商家！",null,null);
            }

            return new BaseResp(1,"课程已经添加成功！",null,null);

    }

    @Override
    public BaseResp findShopCardByToken(HttpServletRequest request) {
        String token = request.getHeader("token");
        String userid = jwtUtils.verfiy(token).toString();
        //判断是否有购物车
        Boolean aBoolean = redisTemplate.hasKey(SHOP_CARD_ + userid);
        if (aBoolean){
            //从reids中获取到该用户添加的所有的课程
            List shopList = redisTemplate.opsForHash().values(SHOP_CARD_ + userid);
            return new BaseResp(1,"查询成功！",shopList,null);
        }else{
            return new BaseResp(0,"购物车为空！请先添加商品！",null,null);
        }
    }

    @Override
    public BaseResp delShop(Map map, HttpServletRequest request) {
        //1.使用redis作为购物车，第一层key 使用用户的id为key值，第二层key使用课程的id，value课程的详情信息
        //1.解析用户的id
        String token = request.getHeader("token");
        String userid = jwtUtils.verfiy(token).toString();
        Object courseid = map.get("courseid");
        if (courseid==null){
            return new BaseResp(0,"商品信息有误！",null,null);
        }
        String courseId= String.valueOf(courseid);
        //判断购物车是否存在
        Boolean aBoolean = redisTemplate.hasKey(SHOP_CARD_ + userid);
        if (aBoolean){
            //如果购物车存在，判断购物车中的数量是否大于1，如果=1，则直接删除该购物车，如果大于1则移除商品
            List values = redisTemplate.opsForHash().values(SHOP_CARD_ + userid);
            if (values!=null&&values.size()>1){
                //说明购物车中有大于1个的课程，则移除1个即可
                redisTemplate.opsForHash().delete(SHOP_CARD_+userid,courseId);
            }else {
                //说明购物车只存在1个商品，则直接删除掉购物车即可
                redisTemplate.delete(SHOP_CARD_+userid);
            }
            return new BaseResp(1,"移除成功！",null,null);
        }

        return new BaseResp(0,"用户购物车不存在！",null,null);
    }
}
